package base

import (
	"JVM/Jvmgo/GoToJVM/runtimeData"
	"JVM/Jvmgo/GoToJVM/runtimeData/heap"
)

func InitClass(thread *runtimeData.Thread, class *heap.Class) {
	class.StartInit()             // 避免进入死循环
	scheduleClinit(thread, class) // 执行 <clinit> 类初始化方法
	initSuperClass(thread, class) // 先执行超类的初始化方法
}

func scheduleClinit(thread *runtimeData.Thread, class *heap.Class) {
	clinit := class.GetClinitMethod()
	if clinit != nil {
		// 执行 类初始化方法
		newFrame := thread.NewFrame(clinit)
		thread.PushFrame(newFrame)
	}
}

// 检查超类是否初始化，没有就优先初始化超类
func initSuperClass(thread *runtimeData.Thread, class *heap.Class) {
	if !class.IsInterface() {
		superClass := class.SuperClass()
		if superClass != nil && !superClass.InitStarted() {
			InitClass(thread, superClass)
		}
	}
}
